// 空间优化
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MOD = 1000;
const int N = 1010, M = 110, K = 150;

int k, x;
int f[M][K];

LL qpow(LL a, LL b, LL p)
{
	LL ans = 1;
	while(b)
	{
		if(b & 1) ans = ans * a % p;
		a = a * a % p;
		b >>= 1;
	}
	return ans;
}

void add(int c[], int b[])
{
	for(int i = 0;i < K - 1;i ++)
	{
		c[i] += b[i];
		c[i + 1] += c[i] / 10;
		c[i] %= 10;
	}
}

int main()
{
	cin >> k >> x;
	LL n = qpow(x, x, MOD);
	// 求C(n - 1, k - 1)
	for(int i = 0;i < n;i ++)
	{
		f[0][0] = 1;
		for(int j = min(i, k);j >= 1;j --) add(f[j], f[j - 1]);
	}
	int t = K - 1;
	while(f[k - 1][t] == 0) t --;
	while(t >= 0) cout << f[k - 1][t --];
	return 0;
}



// #include <bits/stdc++.h>
// using namespace std;
// typedef long long LL;
// const int MOD = 1000;
// const int N = 1010, M = 110, K = 150;

// int k, x;
// int f[N][M][K];

// LL qpow(LL a, LL b, LL p)
// {
// 	LL ans = 1;
// 	while(b)
// 	{
// 		if(b & 1) ans = ans * a % p;
// 		a = a * a % p;
// 		b >>= 1;
// 	}
// 	return ans;
// }

// void add(int c[], int a[], int b[])
// {
// 	for(int i = 0;i < K - 1;i ++)
// 	{
// 		c[i] += a[i] + b[i];
// 		c[i + 1] += c[i] / 10;
// 		c[i] %= 10;
// 	}
// }

// int main()
// {
// 	cin >> k >> x;
// 	LL n = qpow(x, x, MOD);
// 	// 求C(n - 1, k - 1)
// 	for(int i = 0;i <= n;i ++)
// 	{
// 		f[i][0][0] = 1;
// 		for(int j = 1;j <= min(i, k);j ++)
// 			add(f[i][j], f[i - 1][j], f[i - 1][j - 1]);
// 	}
// 	int t = K - 1;
// 	while(f[n - 1][k - 1][t] == 0) t --;
// 	while(t >= 0) cout << f[n - 1][k - 1][t --];
// 	return 0;
// }